package main

import "fmt"

// 指针变量的默认值为 nil
// go语言的指针类型，比较简单，它不能进行运算
// 这里就有个问题go语言的函数参数传递是值传递还是引用传递呢？ 什么是值传递：传递的是值的拷贝；引用传递：传递的是变量的内存的地址
// c和c++是值传递和引用传递都可以，Java和python大部分都是引用传递，php是值传递 想要引用需要在变量前加&符号
// go语言只有值传递，和php类型传递引用则需要在前面加&
func main() {
	var a int = 2
	var pa *int = &a
	*pa = 3
	fmt.Println(a)
	a, b := 3, 4
	swap(a, b)
	fmt.Println(a, b)
	swap1(&a, &b)
	fmt.Println(a, b)
	a, b = 3, 4
	a, b = swap2(a, b)
	fmt.Println(a, b)
	// 指针可以指向数组，指向数组的指针，数组是值类型
	arr := [3]int{1, 2, 3}
	// 这是指向数组的指针
	var ip *[3]int = &arr // 指向一个数组的地址
	fmt.Println(ip)
	// 指针数组
	var ptrs [3]*int // 创建能够储存3个指针变量的数组
	fmt.Println(ptrs)
}

// 交换两个变量的值,这样是无法实现的，因为是值传递无效
func swap(a int, b int) {
	b, a = a, b
}

// 交换两个变量的值只有传递引用，拿到指针才可以
func swap1(a, b *int) {
	*b, *a = *a, *b
}

// 用go语言最简单的方法，直接返回两个值,把返回值颠倒顺序
func swap2(a, b int) (int, int) {
	return b, a
}
